relative role of EMIC waves, whistler-mode waves, and plasmasheet injections
Authors
Affiliation
Zijin Zhang
University of California, Los Angeles
Anton Artemyev
University of California, Los Angeles
Motivation
We observed three strong electron precipitation which lasted for 3 hours from ELFIN missions.
We wanted to investigate the cause of the precipitation.
Import all the libraries
# To make quarto render holoview properly, somehow you can not use `output: false` in the cell optionsimport altair as altimport hvplot.pandas # noqaimport hvplot.xarray # noqaimport holoviews as hvimport proplot as ppltimport panel as pnfrom utilities import*import numpy as npimport pandas as pdimport pdpipe as pdpimport pyspedasimport xarray as xrfrom icecream import icfrom plasmapy.formulary import gyrofrequencyfrom pyspedas import tinterpolfrom pytplot import (get_data, options, split_vec, store_data, tplot, tplot_options)import logginglogger = logging.getLogger()pplt.rc["svg.fonttype"] ="none"
Paramaters of this notebook
PLOT =True
Overview of the April 17 2021 event
Get satellite location data
Note: Location data from SSCWebServices is of low resolution (1 min). Resolution can be improved by using the data from the satellite server directly.
Retrieve data from SSCWebServices and calculate L-Shell and MLT
from sscws.sscws import SscWsimport spacepyfrom spacepy import time, coordinates, irbempy, toolboxdef process_data(data, backend="IRBEM", extMag='T01STORM'): IRBEM_RE =6371.2 sat = data["Id"] time = pd.to_datetime(data["Time"]).tz_convert(None) x = data["Coordinates"][0]["X"] / IRBEM_RE y = data["Coordinates"][0]["Y"] / IRBEM_RE z = data["Coordinates"][0]["Z"] / IRBEM_RE coords = np.array([x, y, z]).T t = spacepy.time.Ticktock(data["Time"], "ISO") loci = spacepy.coordinates.Coords(coords, "GSE", carsph="car", use_irbem=True) Lm = spacepy.irbempy.get_Lm(t, loci, 90, extMag=extMag)# magequator=spacepy.irbempy.find_magequator(t,loci)return pd.DataFrame( {"Id": sat,"Time": pd.Series(time),"X": pd.Series(x),"Y": pd.Series(y),"Z": pd.Series(z),"Lshell": pd.Series(Lm["Lm"].flatten()).abs(),"MltE": pd.Series(Lm["MLT"].flatten()), }, )ssc = SscWs()result = ssc.get_locations(sats, trange)# Use a list comprehension to process data and store results in a listdata_frames = {data["Id"]: process_data(data, extMag='T89') for data in result["Data"]}# Concatenate the data frames into a single DataFramedf = pd.concat(data_frames.values())pline = pdp.PdPipeline( [ pdp.df["Angle"] << pdp.df["MltE"] *15/360*2* np.pi, pdp.df["EquatorX"]<< pdp.df["Lshell"] * (pdp.df["MltE"] *15/360*2* np.pi).map(np.cos), pdp.df["EquatorY"]<< pdp.df["Lshell"] * (pdp.df["MltE"] *15/360*2* np.pi).map(np.sin), ])df = pline.apply(df)for _sat, _df in data_frames.items(): data_frames.update({_sat: pline.SetIndex("Time").apply(_df)})
Save dataframe and dataframes for later use
import pickledf.to_pickle("data/orbit_overview.pkl")withopen("data/orbit_data_frames.pickle", "wb") as handle: pickle.dump(data_frames, handle, protocol=pickle.HIGHEST_PROTOCOL)
Read dataframe and dataframes from files
withopen("data/orbit_data_frames.pickle", "rb") as handle: data_frames = pickle.load(handle)df = pd.read_pickle("data/orbit_overview.pkl")
Inspection of the satellite orbit and sketch plot
Overview orbit plot of all satellites using hvplot
sat ="elfinb"tranges = [ ["2021-04-17 02:42:00", "2021-04-17 02:46:00"], ["2021-04-17 04:14:00", "2021-04-17 04:18:00"], ["2021-04-17 05:47:00", "2021-04-17 05:51:00"],]color_index +=1# create a new DataFrame containing all the time ranges# reindex the DataFrame with the new index to fill the missing rows with NaN values# plot the reindexed DataFramedf = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle","Lshell", data=df, label='ELFIN-B', color=(color_name, color_index), alpha=alpha,)for time in np.array(tranges)[:,0]: ax_point(time)for time in np.array(tranges)[:,1]: ax_point(time, text=False, marker="D")# plot highlighted time ranges of interesttranges = [ ["2021-04-17 02:43:00", "2021-04-17 02:44:00"], ["2021-04-17 04:15:00", "2021-04-17 04:15:00"], ["2021-04-17 05:48:00", "2021-04-17 05:49:00"],]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle","Lshell", data=df, label='', color=(color_name, color_index), lw=4,)
Plot ELFIN-A orbit (Optional)
""" This is commented out because of the low time resolution of the data from SSCWeb."""ifFalse: sat ="elfina" tranges = [ ["2021-04-17 05:15:00", "2021-04-17 05:20:00"], ] color_index +=1# create a new DataFrame containing all the time ranges# reindex the DataFrame with the new index to fill the missing rows with NaN values# plot the reindexed DataFrame df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index) ax.plot("Angle","Lshell", data=df, label='ELFIN-B', color=(color_name, color_index), alpha=alpha, )for time in np.array(tranges)[:,0]: ax_point(time)for time in np.array(tranges)[:,1]: ax_point(time, text=False, marker="D")# plot highlighted time ranges of interest tranges = [ ["2021-04-17 05:16:00", "2021-04-17 05:17:00"], ] df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index) ax.plot("Angle","Lshell", data=df, label='', color=(color_name, color_index), lw=4, )
Plot NOAA-19 orbit
sat ="noaa19"color_index +=1tranges = [ ["2021-04-17 01:47:00", "2021-04-17 01:52:00"], ["2021-04-17 03:30:00", "2021-04-17 03:36:00"],]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle","Lshell", data=df, label="NOAA-19", color=(color_name, color_index), alpha=alpha,)for time in np.array(tranges)[:,0]: ax_point(time)for time in np.array(tranges)[:,1]: ax_point(time, text=False, marker="D")tranges = [ ["2021-04-17 01:49:00", "2021-04-17 01:51:00"], ["2021-04-17 03:33:00", "2021-04-17 03:35:00"],]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle","Lshell", data=df, label='', color=(color_name, color_index), lw=4,)
Plot NOAA-15 orbit
sat ="noaa15"color_index +=1tranges = [ ["2021-04-17 01:15:00", "2021-04-17 01:20:00"], ["2021-04-17 02:58:00", "2021-04-17 03:03:00"],# ["2021-04-17 04:39:00", "2021-04-17 04:44:00"],]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle","Lshell", data=df, label="NOAA-15", color=(color_name, color_index), alpha=alpha,)for time in np.array(tranges)[:,0]: ax_point(time)for time in np.array(tranges)[:,1]: ax_point(time, text=False, marker="D")tranges = [ ["2021-04-17 01:17:00", "2021-04-17 01:19:00"], ["2021-04-17 02:59:00", "2021-04-17 03:02:00"],# ["2021-04-17 04:41:00", "2021-04-17 04:43:00"],]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle","Lshell", data=df, label='', color=(color_name, color_index), lw=4,)
Plot GOES-16 orbit
sat ="goes16"color_index +=1tranges = [ ["2021-04-17 00:00:00", "2021-04-17 12:00:00"],]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle", "Lshell", data=df, label="GOES-16", color=(color_name, color_index), alpha=alpha)for time in np.array(tranges)[:,0]: ax_point(time)for time in np.array(tranges)[:,1]: ax_point(time, text=False, marker="D")tranges = [ ["2021-04-17 02:00:00", "2021-04-17 02:30:00"], # ion injection ["2021-04-17 04:00:00", "2021-04-17 04:30:00"], # electron injection ["2021-04-17 07:00:00", "2021-04-17 07:30:00"], # electron injection]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle","Lshell", data=df, label='', color=(color_name, color_index), lw=4,)for time in np.array(tranges).flatten(): ax_point(time, scatter=False)
Plot MMS-1 orbit
# ! NOTE: mms1 obtained Lm does not agree with the one provided (doesn't matter for this plot)sat ="mms1"color_index +=1tranges = [ ["2021-04-17 00:00:00", "2021-04-17 12:00:00"],]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle", "Lshell", data=df, label="MMS-1", color=(color_name, color_index), alpha=alpha)for time in np.array(tranges)[:,0]: ax_point(time)for time in np.array(tranges)[:,1]: ax_point(time, text=False, marker="D")tranges = [ ["2021-04-17 04:30:00", "2021-04-17 04:45:00"], # electron decrease ["2021-04-17 08:00:00", "2021-04-17 08:15:00"], # electron injection]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle","Lshell", data=df, label='', color=(color_name, color_index), lw=4,)for time in np.array(tranges).flatten(): ax_point(time, scatter=False)
Plot ARASE orbit
sat ="arase"color_index +=1tranges = [ ["2021-04-17 00:00:00", "2021-04-17 12:00:00"],]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle", "Lshell", data=df, label="ARASE", color=(color_name, color_index), alpha=alpha)for time in np.array(tranges)[:,0]: ax_point(time)for time in np.array(tranges)[:,1]: ax_point(time, text=False, marker="D")tranges = [ ["2021-04-17 01:00:00", "2021-04-17 01:15:00"], # electron injection ["2021-04-17 07:10:00", "2021-04-17 07:25:00"], # electron injection]df = pd.concat([data_frames[sat].loc[slice(*trange)] for trange in tranges]).reindex(data_frames[sat].index)ax.plot("Angle","Lshell", data=df, label='', color=(color_name, color_index), lw=4,)for time in np.array(tranges).flatten(): ax_point(time, scatter=False)
Plot the Earth
# create an array of angles from 0 to 2*pir = np.ones(1000)theta = np.linspace(0, 2*np.pi, 1000)# plot the circleax.plot(theta, r, color='black', lw=0.5)# fill the left half of the circle with blackax.fill_between(theta, r, where=theta<np.pi/2, color='black')ax.fill_between(theta, r, where=theta>np.pi*3/2, color='black')
Format the plot
def degree_to_hour(degrees, pos):"""A custom formatting function to convert degrees to hours """ hour = (degrees /2/ np.pi) *24returnf"{int(hour)}"ax.format( title="Multi-mission orbits 2021-04-17 00:00 to 12:00 UTC", thetaformatter="func", thetaformatter_kw={"func": degree_to_hour}, rlim=(0, 15), rlabelpos=135,)ax.legend(loc='r', ncols=1, frame=False, title='Orbits')fig
An overview of the mission orbits recorded on April 17, 2021, from 00:00 to 12:00 UTC. The orbits of distinct missions are projected onto the MLT and L-Shell plane, designated with different colors; star markers denote the orbit initiation, squares indicate their termination, and time annotations are provided near the periods of interest. ELFIN-B’s trajectory is demonstrated in three time intervals: 02:42-02:46, 04:14-04:18, and 05:47-05:51. NOAA-19’s trajectory is plotted from 01:47-01:52 and 03:30-03:36, while NOAA-15’s is displayed from 01:15-01:20 and 02:58-03:03. The trajectories of GOES, MMS, and ARASE span the entirety of the 12-hour interval from 00:00 to 12:00.
Detailed analysis of the April 17 2021 event
ELFIN observations of EMIC driven precipitations during >3hour interval
Two ELFIN satellites observation of EMIC-driven precipitation (where the precipitation flux surpasses the trapped flux in high-energy channels) over an interval exceeding three hours, from 02:42 to 05:53. The locations are projected in proximity to the L-Shell and MLT, using the Tsyganenko (1989) magnetic field model. Panels (a), (b), and (d) encapsulate data from ELFIN-B, while panel (c) features observations from ELFIN-A.
ARASE Part
ARASE observation of whistler wave
Process data from the ERG satellite: retrieve data, interpolate to the same time as the spectra, and export tplot variables
Retrieve data from the ARASE satellite
trange = ["2021-04-17 00:00:00", "2021-04-17 12:00:00"]pyspedas.erg.pwe_ofa(trange=trange, time_clip=True, ror=False)pyspedas.erg.mgf(trange=trange, time_clip=True, ror=False)pyspedas.erg.orb(trange=trange, time_clip=True, ror=False)pyspedas.erg.orb( trange=trange, level="l3", model="t89", time_clip=True, ror=False) # Get equatorial magnetic field data# Interpolate the spacecraft position and magnetic field data to the same time as the spectrasplit_vec("erg_orb_l2_pos_rmlatmlt", new_name="erg_orb_l2_pos_", suffix=["r", "mlat", "mlt"])tinterpol("erg_mgf_l2_magt_8sec", "erg_pwe_ofa_l2_spec_B_spectra_132")tinterpol("erg_orb_l2_pos_Lm", "erg_pwe_ofa_l2_spec_B_spectra_132")tinterpol("erg_orb_l2_pos_mlat", "erg_pwe_ofa_l2_spec_B_spectra_132")tinterpol("erg_orb_l3_pos_beq_t89", "erg_pwe_ofa_l2_spec_B_spectra_132")# Get the data from pytplot variableserg_mgf_magt_itrp = get_data("erg_mgf_l2_magt_8sec-itrp")pwe_spec = get_data("erg_pwe_ofa_l2_spec_B_spectra_132")pwe_spec_xr = get_data("erg_pwe_ofa_l2_spec_B_spectra_132", xarray=True)orb_Lm_itrp = get_data("erg_orb_l2_pos_Lm-itrp", xarray=True)orb_mlat_itrp = get_data("erg_orb_l2_pos_mlat-itrp", xarray=True)orb_beq_itrp = get_data("erg_orb_l3_pos_beq_t89-itrp", xarray=True)
Overview of ARASE observations
# Plot the PWE data with the gyrofrequency data and magnetic field data# Store gyrofrequency data with the PWE datamag_t = erg_mgf_magt_itrp.y * u.nTomega_e = gyrofrequency(mag_t, "e-", to_hz=True).to("kHz")upper_bound =0.1* gyrofrequency(mag_t, "e-", to_hz=True).to("kHz")lower_bound =0.5* gyrofrequency(mag_t, "e-", to_hz=True).to("kHz")store_data("omega_e", data={"x": erg_mgf_magt_itrp.times, "y": omega_e})store_data("omega_e01", data={"x": erg_mgf_magt_itrp.times, "y": lower_bound})store_data("omega_e05", data={"x": erg_mgf_magt_itrp.times, "y": upper_bound})# convert omega_e to a DataArrayomega_e_da = xr.DataArray(omega_e, coords=[pwe_spec_xr.time], dims=["time"])# store the combined datastore_data("combined_data", data=["omega_e", "omega_e01", "omega_e05", "erg_pwe_ofa_l2_spec_B_spectra_132"],)options("combined_data", "spec", True)options("omega_e", "yrange", [pwe_spec.v[0], pwe_spec.v[-1]])tplot(["combined_data"])tplot(["erg_orb_l2_pos_Lm", "erg_orb_l3_pos_blocal_t89", "erg_orb_l3_pos_beq_t89"])# tplot(["combined_data"],save_png='../figures/erg_pwe_spec')
22-Jun-23 13:06:01: combined_data does not contain coordinates for spectrogram plotting. Continuing...
Get the whistler waves normalized mean frequencies from Arase mission for calculating diffusion coefficients.
Code
# filter the datalower_bound =0.1upper_bound =0.5step =0.025interested_freq =lambda x: (x.spec_bins < upper_bound * omega_e_da) & ( x.spec_bins > lower_bound * omega_e_da)pwe_spec_filtered = pwe_spec_xr.where(interested_freq, 1e-5)# only keep the time when the maximum intensity is at the interested frequency (whistler mode)interested_time = pwe_spec_xr.argmax(dim="v_dim") == pwe_spec_filtered.argmax( dim="v_dim")pwe_spec_temp = pwe_spec_xr.where(interested_time)pwe_spec_filtered = pwe_spec_temp.where(interested_freq)def summed_intensity(_lower_bound, _upper_bound): interested_freq =lambda x: (x.spec_bins < _upper_bound * omega_e_da) & ( x.spec_bins > _lower_bound * omega_e_da )# TODO: better way to acculmulate this intensity for uneven frequency bins pwe_spec_freq = ( pwe_spec_temp.where(interested_freq).mean(dim=["v_dim"])* (_upper_bound - _lower_bound)* omega_e_da*1000# convert to Hz ) rel_freq = xr.DataArray( [(_upper_bound + _lower_bound) /2], dims=["relative_frequency"], attrs={"long_name": "Relative Frequency", "units": r"$\omega_{ce}$"}, ) pwe_spec_freq.attrs["long_name"] ="Wave intensity" pwe_spec_freq.attrs["units"] =r"$pT^2$"return pwe_spec_freq.expand_dims( dim={"relative_frequency": rel_freq} ).assign_coords({"relative_frequency": rel_freq})lower_bounds = np.arange(lower_bound, upper_bound, step)upper_bounds = np.arange(lower_bound + step, upper_bound + step, step)da = xr.concat( [ summed_intensity(_lower_bound, _upper_bound)for _lower_bound, _upper_bound inzip(lower_bounds, upper_bounds) ], dim="relative_frequency",)avg_da = ( da.assign_coords({"Lm": ("time", orb_Lm_itrp.data[:, 0])}) .where(lambda x: (x.Lm <6.5) & (x.Lm >4.5)) .mean(dim="time"))relative_frequency = avg_da.idxmax().valuesprint(f"Normalized mean frequencies of whistler waves: {relative_frequency}")# Plot the summed intensity of the PWE data between 0.1 and 0.5 omega_e# fig, axs = pplt.subplots()# axs.plot(avg_da)
Normalized mean frequencies of whistler waves: 0.31249999999999994
Whistler mode waves observed by ARASE
# Calculate omega_e_maxomega_e_max = relative_frequency * gyrofrequency(mag_t, "e-", to_hz=True).to("kHz")# store the filtered datastore_data("pwe_spec_filtered", data={"x": pwe_spec.times, "y": pwe_spec_filtered, "v": pwe_spec.v},)# Store omega_e_max datastore_data("omega_e_max", data={"x": erg_mgf_magt_itrp.times, "y": omega_e_max})# Store the combined datacombined_data = ["omega_e_max", "pwe_spec_filtered"]store_data("combined_data", data=combined_data)# Set optionsoptions("combined_data", "spec", True)options("pwe_spec_filtered", "spec", True)options("pwe_spec_filtered", "ylog", True)options("pwe_spec_filtered", "yrange", [pwe_spec.v[0], pwe_spec.v[-1]])options("pwe_spec_filtered", "ytitle", "Frequency")options("pwe_spec_filtered", "ysubtitle", "[kHz]")options("pwe_spec_filtered", "zlog", True)options("pwe_spec_filtered", "zrange", [1e-4, 1e2])options("pwe_spec_filtered", "ztitle", "Intensity")options("pwe_spec_filtered", "zsubtitle", "[pT^2/Hz]")# Plot the combined_datatplot("combined_data")
21-Jun-23 21:17:22: combined_data does not contain coordinates for spectrogram plotting. Continuing...
ds = {key: get_data(value, xarray=True) for (key, value) invars.items()}for key in ds.keys():match key:case"erg_mep_ele": ds[key].attrs.update( {"long_name": 'ARASE electron',"units": r'$1/s/cm^2/sr/keV$',"labels":[f'{erg:0.0f} keV'for erg in ds[key].spec_bins.values] } )# Replace all occurrences of 0 with NaN ds[key] = ds[key].where(ds[key] !=0)case"erg_mep_pro": ds[key].attrs.update( {"long_name": "ARASE proton","units": r'$1/s/cm^2/sr/keV$',"labels":[f'{erg:0.0f} keV'for erg in ds[key].spec_bins.values] } )# Replace all occurrences of 0 with NaN ds[key] = ds[key].where(ds[key] !=0)case"erg_mgf": ds[key].attrs.update( {"long_name": "ARASE B","units": 'nT',"labels": [r'$B_x$',r'$B_y$',r'$B_z$'], } )case"erg_mlt": ds[key].attrs.update({"long_name": 'MLT'})case"erg_l": ds[key].attrs.update({"long_name": 'L shell'})# Replace all occurrences of 0 with NaN ds[key] = ds[key].where(ds[key] !=0)
ARASE electron and proton observations (~10 keV to ~100 keV). Strong electron injection are visible at the beginning of EMIC-driven electron precipitations and at the end of interval.
Investigate changing fo high energy fluxes over time from ARASE
def time_group(time):"""Group data points by time"""# Set a threshold time interval for grouping data time_threshold = pd.Timedelta(minutes=30)# Compute the time intervals between each data point time_delta = time.diff()# Create a boolean mask for identifying the start of each group group_start_mask = (time_delta > time_threshold) | time_delta.isnull()# Assign a group ID to each data point based on the start of each groupreturn group_start_mask.cumsum()erg_orb_pipe = pdp.PdPipeline( [# only keep data where Lm > 5 and 10 > mlat > -10 pdp.keep_rows_where["erg_orb_l2_pos_Lm"] >4.5, pdp.keep_rows_where["erg_orb_l2_pos_Lm"] <5.5, pdp.keep_rows_where["erg_orb_l2_pos_mlat"] >-10, pdp.keep_rows_where["erg_orb_l2_pos_mlat"] <10,# group data by time pdp.ColByFrameFunc("group_id", lambda df: time_group(df.index.to_series())), ])erg_orb_df = xr.merge([erg_orb_Lm[:, 0], erg_orb_mlat, erg_orb_mlt]).to_dataframe()erg_orb_df_filtered = erg_orb_pipe.apply(erg_orb_df)
Plot the overview of the ERG orbit during the period of interest
22-Jun-23 11:40:19: /Users/zijin/mambaforge/envs/cool_space_science/lib/python3.10/site-packages/pytplot/MPLPlotter/specplot.py:102: RuntimeWarning: divide by zero encountered in log10
zdata = np.log10(out_values)
Get MMS data into xarray and update the metadata
ds = {key: get_data(value, xarray=True) for (key, value) invars.items()}for key in ds.keys():match key.split('_', 1)[1]:case"feeps_ele"|"feeps_proton": ds[key].attrs.update( {"long_name": ds[key].attrs["plot_options"]["yaxis_opt"]["axis_label"],"units": ds[key].attrs["plot_options"]['zaxis_opt']["axis_label"],"labels":[f'{erg:0.0f} keV'for erg in ds[key].spec_bins.values] } )case"fgm_bvec": ds[key].attrs.update( {"long_name": "MMS1 B","units": 'nT',"labels": [r'$B_x$',r'$B_y$',r'$B_z$'], } )case"mlt": ds[key].attrs.update({"long_name": 'MLT'})case"l_dipole": ds[key].attrs.update({"long_name": 'L shell'})
MMS electron and proton observations (~50 keV to ~500 keV). Localized decrease of electron fluxes is notable around ELFIN observations of EMIC driven precipitations and strong electron injection signatures are visible at the end of EMIC-driven electron precipitations.
POES observations of proton precipitation confirms the L-shell localization of EMIC generation region between L~4.5 and 6. At L>6 POES shows strong curvature scattering of protons indicating on isotropic equatorial distribution and no EMIC wave generation”
GOES observations of electron and proton
Overview of GOES from THEMIS website
Particle data is from Space Environment In Situ Suite (SEISS) instrument.
GOES-R electron and proton observations (70 keV to ~1 MeV) from two geostationary operatioinal satellites. Ion injections are visible before the time when ELFIN observed strong electron precipitation. Series of strong electron injections observed around noon after drifting from the midnight.